/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mrp.beans;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedProperty;
import javax.faces.context.FacesContext;
import javax.faces.component.html.HtmlInputHidden;

import mrp.login.Login;
import mrp.entity.GestorBaseDatos;
import mrp.persistencia.controller.ClienteJpaController;

import mrp.persistencia.controller.TablaindiceJpaController;
import mrp.persistencia.controller.exceptions.NonexistentEntityException;
import mrp.persistencia.controller.exceptions.PreexistingEntityException;
import mrp.persistencia.controller.exceptions.RollbackFailureException;
import mrp.persistencia.entity.Cliente;
import mrp.persistencia.entity.Empresa;
import mrp.persistencia.entity.Persona;
import mrp.web.ClienteWeb;
//import mrp.entity.Cliente;
/**
 *
 * @author root
 */
//@ManagedBean(name="cliente")
//@SessionScoped
public class ClienteBean implements Serializable{
    
//    @ManagedProperty("#{usuarioBean}")
//    private UsuarioBean usuarioBean;
//    @ManagedProperty("#{login}")
//    private Login login;
//    @ManagedProperty("#{clienteweb}")
//    private ClienteWeb clienteweb;
    
//    private Cliente cliente;
    private ClienteJpaController clienteController;
    private Cliente cliente;
    private Persona persona;
    private Empresa empresa;
    private String personaEmpresa;
       
    //-------------------- constructor-----------------------

    public ClienteBean() {
        clienteController=new ClienteJpaController();
    }
    
    
    /////////////////////metodos getters and setters
//    public Login getLogin() {
//        return login;
//    }
//    public void setLogin(Login login) {
//        this.login = login;
//    }
//    public UsuarioBean getUsuarioBean() {
//        return usuarioBean;
//    }
//
//    public void setUsuarioBean(UsuarioBean usuarioBean) {
//        this.usuarioBean = usuarioBean;
//    }

    public Cliente getCliente() {
        return this.cliente;
    }

    public void setCliente(Cliente jpaCliente) {
        this.cliente = jpaCliente;
    }
        public String getPersonaEmpresa() {
        return personaEmpresa;
    }

    public void setPersonaEmpresa(String personaEmpresa) {
        this.personaEmpresa = personaEmpresa;
    }

    public Empresa getEmpresa() {
        return empresa;
    }

    public void setEmpresa(Empresa empresa) {
        this.empresa = empresa;
    }

    public Persona getPersona() {
        return persona;
    }

    public void setPersona(Persona persona) {
        this.persona = persona;
    }         
    
//    public String getDigitador() {
//        return this.cliente.getDigitador();
//    }
//
//    public void setDigitador(String digitador) {
//        this.cliente.setDigitador(digitador);
//    }
//    public String getDireccion() {
//        return this.cliente.getDireccion();
//    }
//    public void setDireccion(String direccion) {
//        this.cliente.setDireccion(direccion);
//    }
//    public String getFechaDigitador() {
//        return this.cliente.getFechaDigitador();
//    }
//    public void setFechaDigitador(String fechaDigitador) {
//        this.cliente.setFechaDigitador(fechaDigitador);
//    }
//    public String getFechaIngreso() {
//        return this.cliente.getFechaIngreso();
//    }
//    public void setFechaIngreso(String fechaIngreso) {
//        this.cliente.setFechaIngreso(fechaIngreso);
//    }
//    public String getNombreCliente() {
//        return this.cliente.getNombreCliente();
//    }
//
//    public void setNombreCliente(String nombreCliente) {
//        this.cliente.setNombreCliente(nombreCliente);
//    }
//
//    public String getNombreEmpresa() {
//        return this.cliente.getNombreEmpresa();
//    }
//
//    public void setNombreEmpresa(String nombreEmpresa) {
//        this.cliente.setNombreEmpresa(nombreEmpresa);
//    }
//
//    public String getNumeroCedula() {
//        return this.cliente.getNumeroCedula();
//    }
//
//    public void setNumeroCedula(String numeroCedula) {
//        this.cliente.setNumeroCedula(numeroCedula);
//    }
//
//    public String getNumeroCliente() {
//        return this.cliente.getNumeroCliente();
//    }
//
//    public void setNumeroCliente(String numeroCliente) {
//        this.cliente.setNumeroCliente(numeroCliente);
//    }
//
//    public Integer getPrioridadCliente() {
//        return (Integer)this.cliente.getPrioridadCliente();
//    }
//
//    public void setPrioridadCliente(Integer prioridadCliente) {
//        this.cliente.setPrioridadCliente((int)prioridadCliente);
//    }
//
//    public String getRepresentanteLegal() {
//        return this.cliente.getRepresentanteLegal();
//    }
//
//    public void setRepresentanteLegal(String representanteLegal) {
//        this.cliente.setRepresentanteLegal(representanteLegal);
//    }
//
//    public String getRuc() {
//        return this.cliente.getRuc();
//    }
//
//    public void setRuc(String ruc) {
//        this.cliente.setRuc(ruc);
//    }
//
//    public String getTelefono() {
//        return this.cliente.getTelefono();
//    }
//
//    public void setTelefono(String telefono) {
//        this.cliente.setTelefono(telefono);
//    }
//
//    public String getTelefonoCelular() {
//        return this.cliente.getTelefonoCelular();
//    }
//
//    public void setTelefonoCelular(String telefonoCelular) {
//        this.cliente.setTelefonoCelular(telefonoCelular);
//    }
//    
//    public ClienteWeb getClienteweb() {
//        return clienteweb;
//    }
//
//    public void setClienteweb(ClienteWeb clienteweb) {
//        this.clienteweb = clienteweb;
//    }
//

    
/////////////////fin metodos getters and setters
     ///////////metodos de la clase cliente
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
    }
//    public String convertirFecha(Date fecha)
//    {
//        SimpleDateFormat formatofecha = new SimpleDateFormat("yyyy-MM-dd");
//        return formatofecha.format(fecha);
//        
//    }
//    public Date convertirAFecha(String fecha)
//    {
//        SimpleDateFormat formatofecha = new SimpleDateFormat("yyyy-MM-dd");
//                    
//        Date fechaDate = null;
//        try 
//        {
//            fechaDate = formatofecha.parse(fecha);
//        } 
//        catch (java.text.ParseException ex) 
//        {
//            ex.printStackTrace();
//        }
//        return fechaDate;     
//    }
//    public boolean verficaFechaMenorFechaActual(String fechaSistema)
//    {
//        String fechaIngresada= this.getFechaIngreso();
//        int anioIngresado=Integer.parseInt(fechaIngresada.substring(0,4));
//        int anioSistema=Integer.parseInt(fechaSistema.substring(0, 4));
//        int mesIngresado=Integer.parseInt(fechaIngresada.substring(5,7));
//        int mesSistema=Integer.parseInt(fechaSistema.substring(5, 7));
//        int diaIngresado=Integer.parseInt(fechaIngresada.substring(8,10));
//        int diaSistema=Integer.parseInt(fechaSistema.substring(8,10));
//        
//        if(anioIngresado<=anioSistema)
//        {
//            if(mesIngresado<mesSistema)
//            {
//                return true;
//            }
//            else
//            {
//                if((mesIngresado==mesSistema)&&(diaIngresado<=diaSistema))
//                {
//                    return true;
//                }
//                else
//                {
//                    return false;
//                }                
//            }
//        }
//        else
//        {
//            return false;
//        }
//    }
//    public void mostrarMensaje(String tipoMensaje,String mensaje, String detalle)
//    {
//        if(tipoMensaje.equals("info"))
//        {
//            FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(FacesMessage.SEVERITY_INFO, mensaje,detalle) );   
//        }else{
//            if(tipoMensaje.equals("error"))
//            {
//                FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(FacesMessage.SEVERITY_ERROR, mensaje,detalle) );   
//            }else{
//                if(tipoMensaje.equals("fatal"))
//                {
//                    FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(FacesMessage.SEVERITY_FATAL, mensaje,detalle) );   
//                }else{
//                    if(tipoMensaje.equals("alerta"))
//                    {
//                        FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(FacesMessage.SEVERITY_WARN, mensaje,detalle) );   
//                    }
//                }
//            }
//        }
//    }
    public void borrarDatos()
    {
        cliente=new Cliente();
    }
//    public boolean verificarLogin()
//    {
//        if(login.verificarSesionUsuario().equals(usuarioBean.getUsuario().getIdSesion()))
//        {           
//            return true;
//        }
//        else
//        {
//            this.mostrarMensaje("error","No está ingresado al sistema","");
//            this.borrarDatos();
//        }
//        return false;
//    }
//    public void setearConexion(GestorBaseDatos gbd)
//    {
//        gbd.setUsuario(usuarioBean.getUsuario().getCedulaUsuario());
//        gbd.setClave(usuarioBean.getUsuario().getClave());
//        gbd.setBasedatos("BDEgoZapateria");
//        gbd.setPuerto("5432");
//        gbd.setServidor("localhost");
//    }
    
    public List<Object> ingresarCliente()
    {        
       /* if(this.verificarLogin()&&this.validarCedula(this.getNumeroCedula()))
        {
            String personaEmpresa=this.getPersonaEmpresa();
            boolean noExiste;
            
            GestorBaseDatos gbd=new GestorBaseDatos();
            this.setearConexion(gbd);
            
            //Verifica que la fecha no sea mayor a la actual
             //obtener fecha y hora del servidor
            List fechaList=gbd.select("SELECT TIMESTAMP WITHOUT TIME ZONE \'now\'");
            String fechaHora=(fechaList.get(0).toString()).substring(0,19);
            
            if(this.verficaFechaMenorFechaActual(fechaHora))
            {
            
                if(personaEmpresa.equals("P"))
                {   
                    noExiste=(gbd.select("select NumeroCedula from Persona where Persona.NumeroCedula = \'"+this.getNumeroCedula()+"\'")).isEmpty(); 
                }
                else
                {   
                    noExiste=(gbd.select("select RUC from Empresa where Empresa.RUC = \'"+this.getRuc()+"\'")).isEmpty();               
                }
                if(noExiste)
                {
                    List <String> datosLista= new ArrayList<String>();
                    String respuestaInsert; //es la respuesta del insert si se almaceno o no los datos

                    //Generacion del primary key
                    this.setNumeroCliente(gbd.generaCodigo("cliente", "C"+personaEmpresa));
                    datosLista.add(0,"\'"+this.getNumeroCliente()+"\'");

                    //Datos para tabla Cliente
                    datosLista.add(1,"\'"+this.getDireccion().trim()+"\'");
                    datosLista.add(2,"\'"+this.getFechaIngreso()+"\'");
                    datosLista.add(3,"\'"+this.getTelefono().trim()+"\'");
                    datosLista.add(4,"\'"+this.getTelefonoCelular().trim()+"\'");
                    datosLista.add(5,""+this.getPrioridadCliente());
                    datosLista.add(6,this.usuarioBean.getUsuario().getCodUsuario());

                    datosLista.add(7,"\'"+fechaHora+"\'");

                    //Almacenar datos en la tabla cliente
                    respuestaInsert=""+gbd.insert("Cliente",datosLista,true);

                    //datosLista.add(,this);

                    if(respuestaInsert.equals("Registro almacenado correctamente"))
                    {
                        if(personaEmpresa.equals("P"))
                        {
                            //Datos para tabla Persona   
                            datosLista.clear();
                            datosLista.add(0,"\'"+this.getNumeroCedula()+"\'");
                            datosLista.add(1, "\'"+this.getNombreCliente()+"\'");
                            datosLista.add(2,"\'"+this.getNumeroCliente()+"\'");
                            respuestaInsert=gbd.insert("Persona", datosLista,true);
                        }
                        else
                        {
                            //Datos para tabla Empresa
                            datosLista.clear();
                            datosLista.add(0,"\'"+this.getRuc()+"\'");
                            datosLista.add(1,"\'"+this.getNombreEmpresa()+"\'");
                            datosLista.add(2,"\'"+this.getRepresentanteLegal()+"\'");
                            datosLista.add(3,"\'"+this.getNumeroCliente()+"\'");
                            respuestaInsert=gbd.insert("Empresa",datosLista,true);
                        }
                    }            
                    if(respuestaInsert.equals("Registro almacenado correctamente"))
                    {
                            mostrarMensaje("info","Ingresado Nuevo Cliente!","");
                            //gbd.commit();
                            //gbd.desconectar();
                            this.borrarDatos();
                            return true;
                    }
                    else
                    {
                        //gbd.rollback();
                        //gbd.desconectar();
                        mostrarMensaje("fatal","Error al almacenar los datos","");                    
                    }
                    //System.out.println("personaEmpresa------ ´´´´= "+personaEmpresa);
                }
                else
                {
                    this.mostrarMensaje("error","Error: El cliente que desea ingresar ya existe","");
                    this.borrarDatos();     
                    return true;
                }
            }
            else
            {
                this.mostrarMensaje("error","Error: La fecha es incorrecta.","");
            }
        }
        return false;*/
        List listaRespuesta=new ArrayList<Object>();
         
        try {    
            TablaindiceJpaController tic=new TablaindiceJpaController();
            String numerocliente=tic.generaCodigo("cliente", "CL");
//            this.getCliente().setNumerocliente(numerocliente);
            
            if(personaEmpresa.equals("P"))
            {   
                this.getPersona().setNumerocliente(numerocliente);  
                this.clienteController.create(this.getPersona(),"Persona");
            }
            else
            {   
                this.getEmpresa().setNumerocliente(numerocliente);
                this.clienteController.create(this.getEmpresa(), "Empresa");
            }
            
            listaRespuesta.add(true);
            listaRespuesta.add("Creado Nuevo Cliente!");
            return listaRespuesta;
        } catch (PreexistingEntityException ex) {
            //System.out.println(" primero por aca!!!! mensaje = "+ex.getMessage());
            listaRespuesta.add(false);
            listaRespuesta.add(ex.getMessage());//"El cliente que desea crear ya existe!");
            ex.printStackTrace();
            Logger.getLogger(ClienteBean.class.getName()).log(Level.SEVERE, null, ex);
        } catch (RollbackFailureException ex) {
            listaRespuesta.add(false);
            listaRespuesta.add("Error al crear nuevo cliente!");                       
            ex.printStackTrace();          
            Logger.getLogger(ClienteBean.class.getName()).log(Level.SEVERE, null, ex);
        } 
        catch (Exception ex) {
            listaRespuesta.add(false);
            listaRespuesta.add("Error al crear nuevo cliente!");
            //System.out.println("-------------&&&&&&&&&& mensaje = "+ex.getMessage());           
            ex.printStackTrace();            
            Logger.getLogger(ClienteBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        
         return listaRespuesta;
    }

    
    
    /////////////
    private List<Cliente> listaClietne;
    
    public List<Cliente> getListaClietne() {
        return listaClietne;
    }

       
    public List<List> consultarCliente(String consultar, String criterioConsulta,String coincidencia,int maxResultados,int primerResultado,boolean todo)
    {   
        List<List>listaRetorno=new ArrayList<List>();
        List<Persona>listaPersona=new ArrayList<Persona>();
        List<Empresa>listaEmpresa=new ArrayList<Empresa>();
        consultar=consultar.toUpperCase();
        String query="select c ";       
        String from=" from Cliente as c";
        String where=" where c.numerocliente=";
        String and=" ";
        String like=" like \'%"+consultar+"%\'";
        
        if(coincidencia.equals("exacta"))
        {like=" like \'"+consultar+"\'";}
        else{
        if(coincidencia.equals("inicial"))
        {like=" like \'"+consultar+"%\'";}
        else{ if(coincidencia.equals("final"))
        {like=" like \'%"+consultar+"\'";}}
        }
        
        //persona
        if(criterioConsulta.equals("NumeroCedula")||criterioConsulta.equals("NombreCliente"))
        {
            criterioConsulta=criterioConsulta.toLowerCase();
             
            from=" from  Persona as c ";
            where=" where c."+criterioConsulta+" ";
            and=" ";
            query="select c "+from+where+and+like+" order by c.numerocliente";
            listaPersona= this.clienteController.findClientePersonaWhereOrderBy(query, todo, maxResultados, primerResultado);
        }
        else if(criterioConsulta.equals("RUC")||criterioConsulta.equals("NombreEmpresa"))
        {
            criterioConsulta=criterioConsulta.toLowerCase();
            ////Empresa
            from=" from  Empresa as c";
            where=" where c."+criterioConsulta+" ";
            and=" ";
            query="select c "+from+where+and+like+" order by c.numerocliente";
            listaEmpresa= this.clienteController.findClienteEmpresaWhereOrderBy(query, todo, maxResultados, primerResultado);
        }
        else
        {
           
            if(criterioConsulta.equals("Todo"))
            {
                query="select c from Persona as c order by c.numerocliente";
                listaPersona= this.clienteController.findClientePersonaWhereOrderBy(query, todo, maxResultados, primerResultado);
                query="select c from Empresa as c order by c.numerocliente";
                listaEmpresa= this.clienteController.findClienteEmpresaWhereOrderBy(query, todo, maxResultados, primerResultado);          
            }
            else
            {
                if(criterioConsulta.equals("PrioridadCliente"))
                {
                    like="="+consultar;
                }  
                criterioConsulta=criterioConsulta.toLowerCase();
                from=" from  Persona as c ";
                where=" where c."+criterioConsulta+" ";
                query="select c "+from+where+and+like+" order by c.numerocliente";
    //            query="select c "+from+"";
                listaPersona= this.clienteController.findClientePersonaWhereOrderBy(query, todo, maxResultados, primerResultado);
                from=" from  Empresa as c";
                where=" where c."+criterioConsulta+" ";
                query="select c "+from+where+and+like+" order by c.numerocliente";
    //            query="select c "+from+"";
                listaEmpresa= this.clienteController.findClienteEmpresaWhereOrderBy(query, todo, maxResultados, primerResultado);          
            }
        }
        listaRetorno.add(listaPersona);
        listaRetorno.add(listaEmpresa);
        return listaRetorno;
    }
    ////////////
    
    public List<Object> modificarDatosCliente()
    {
         List listaRespuesta=new ArrayList<Object>();
         try {               
            
            if(personaEmpresa.equals("P"))
            {   
                this.clienteController.edit(this.getPersona(),"Persona");
            }
            else
            {   
                this.clienteController.edit(this.getEmpresa(), "Empresa");
            }
            
            listaRespuesta.add(true);
            listaRespuesta.add("Actualizado datos de cliente!");
            return listaRespuesta;
        } catch (NonexistentEntityException ex) {
            //System.out.println(" primero por aca!!!! mensaje = "+ex.getMessage());
            listaRespuesta.add(false);
            listaRespuesta.add(ex.getMessage());//"El cliente que desea crear ya existe!");
            ex.printStackTrace();
            Logger.getLogger(ClienteBean.class.getName()).log(Level.SEVERE, null, ex);
        } catch (RollbackFailureException ex) {
            listaRespuesta.add(false);
            listaRespuesta.add("Error al actualizar datos de cliente!");                       
            ex.printStackTrace();          
            Logger.getLogger(ClienteBean.class.getName()).log(Level.SEVERE, null, ex);
        } 
        catch (Exception ex) {
            listaRespuesta.add(false);
            listaRespuesta.add("Error al actualizar datos de cliente!");
            //System.out.println("-------------&&&&&&&&&& mensaje = "+ex.getMessage());           
            ex.printStackTrace();            
            Logger.getLogger(ClienteBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return listaRespuesta;
    }
    public List<Object> eliminarCliente(String numeroCliente,String entidad)
    {        
        List listaRespuesta=new ArrayList<Object>();
        
        try {                                    
                this.clienteController.destroy(numeroCliente,entidad);
                listaRespuesta.add(true);
                listaRespuesta.add("Cliente "+numeroCliente+" eliminado!");
                return listaRespuesta;
            } catch (NonexistentEntityException ex) {
                listaRespuesta.add(false);
                listaRespuesta.add("Cliente "+numeroCliente+", que desea eliminar no existe!");
                ex.printStackTrace();
                Logger.getLogger(HormaBean.class.getName()).log(Level.SEVERE, null, ex);        
            } catch (Exception ex) {
                listaRespuesta.add(false);
                listaRespuesta.add("Error al eliminar Cliente "+numeroCliente+"! "+ex);
                ex.printStackTrace();
                Logger.getLogger(HormaBean.class.getName()).log(Level.SEVERE, null, ex);
            }
        return listaRespuesta;
        
//        if(this.verificarLogin())
//        {
//            int tienePedidos=-1;
//            GestorBaseDatos gbd=new GestorBaseDatos();
//            this.setearConexion(gbd);
//            //verificar que el cliente a eliminar no tenga realizado pedidos
//            tienePedidos=Integer.parseInt((gbd.select("select count(NumeroNotaPedido) from Pedido where  Cliente_fk= \'"+numeroCliente+"\'")).get(0).toString()); 
//            if(tienePedidos==0)            
//            {
//                if(numeroCliente.startsWith("CP"))
//                {
//                    if(gbd.delete("Persona","Cliente_fk", "\'"+numeroCliente+"\'",true))
//                    {
//                        if(gbd.delete("Cliente","numeroCliente", "\'"+numeroCliente+"\'",true))
//                        {
//                            //gbd.commit();
//                            //gbd.desconectar();
//                            return true;                        
//                        }
//                        else
//                        {
//                            //gbd.rollback();
//                            //gbd.desconectar();
//                        }
//                    }
//                    else
//                    {
//                        //gbd.rollback();
//                        //gbd.desconectar();
//                    }
//                }
//                else
//                {
//                    if(gbd.delete("Empresa","Cliente_fk","\'"+numeroCliente+"\'",true))
//                    {
//                        if(gbd.delete("Cliente","numeroCliente", "\'"+numeroCliente+"\'",true)){ 
//                            //gbd.commit();
//                            //gbd.desconectar();
//                            return true;                        
//                        }
//                        else
//                        {
//                            //gbd.rollback();
//                            //gbd.desconectar();
//                        }
//                    }
//                    else
//                    {
//                        //gbd.rollback();
//                        //gbd.desconectar();
//                    }
//                }                
//            }
//        }
//        return false;
    }
}

